package com.wc.data_structures.stack;

import java.util.Arrays;

/**
 * @Author congge
 * @Date 2023/4/19 20:43
 * @description 栈的学习
 */
public class ArrayStackDemo {
    public static void main(String[] args) {
        ArrayStack<Integer> stack = new ArrayStack<>(10);
        stack.push(1);
        stack.push(2);
        stack.show();
        stack.pop();
        stack.show();
        stack.pop();
        stack.show();
    }
}

class ArrayStack<T> {
    // 栈顶位置
    private int top;

    // 栈内的大小
    private final int maxSize;

    // 存放站内元素
    private final T[] stack;

    public ArrayStack(int maxSize) {
        stack = (T[]) new Object[maxSize];
        top = -1;
        this.maxSize = maxSize;
    }

    /**
     * 判断栈是否为空
     *
     * @return
     */
    public boolean isEmpty() {
        return top == -1;
    }

    public boolean isFull() {
        return top == maxSize - 1;
    }

    /**
     * 入栈
     *
     * @param value
     * @return true 表示入栈成功，false 表示入栈失败
     */
    public boolean push(T value) {
        if (isFull()) {
            return false;
        }

        top++;
        stack[top] = value;
        return true;
    }

    /**
     * 出栈
     *
     * @return null：表示占栈中没有元素，true 表示出栈成功
     */
    public T pop() {
        if (isEmpty()) {
            return null;
        }
        T ret = stack[top];
        top--;
        return ret;
    }

    /**
     * 获得栈顶元素
     *
     * @return
     */
    public T peek() {
        if (isEmpty()) {
            return null;
        }
        return stack[top];
    }

    /**
     * 表示占中有多少个元素
     *
     * @return
     */
    public int size() {
        return top + 1;
    }

    /**
     * 展示栈中元素
     */
    public void show() {
        if (isEmpty()) {
            System.out.println("栈内无元素");
        }
        for (int i = top; i >= 0; i--) {
            System.out.print(stack[i].toString() + " ");
        }
        System.out.println();
    }
}
